home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / HELLSRC.ZIP / P1.ASM < prev    next >
Assembly Source File  |  1993-10-26  |  25KB  |  856 lines

  1.         .386p
  2. code32  segment para public use32
  3.         assume cs:code32, ds:code32
  4.  
  5. include pmode.inc
  6. include gsp669.inc
  7. include vect3.inc
  8. include kb.inc
  9. include v.inc
  10.  
  11. public  _p1
  12.  
  13. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  14. ; DATA
  15. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  16. align 4
  17. BIGPENTSPRLEN   = 17468
  18. SMALLPENTSPRLEN = 64*43
  19.  
  20. MUZLOC0         = 0100h
  21. MUZLOC1         = 0120h
  22. MUZLOC2         = 0200h
  23. MUZLOC3         = 0220h
  24. MUZLOC4         = 0300h
  25. MUZLOC5         = 0320h
  26. MUZLOC6         = 0500h
  27.  
  28. dpalptr0        dd      ?               ; ptr to transparent small pent pal
  29. bigpentsprptr   dd      ?               ; ptr to big pentagram compiled sprite
  30. bigpentlocptr    dd    ?        ; ptr to current big pent index loc
  31. smallpentsprptr dd      ?,?,?,?,?       ; ptr to small pentagram sprites
  32. pagebaseptr    dd    ?        ; ptr to current video page base
  33.  
  34. bwssppalptr     dd      ?               ; ptr to b/w plasma palette
  35. bwsspswtblptr   dd      ?               ; sine wave table ptr
  36. bwssprasterbuf  dd      ?               ; raster sine wave sum buffer
  37.  
  38. p1m1seqrout     dd      p1m1sr0         ; sequence routine for b/w plasma
  39.  
  40. p1m0seqrout     dd      p1m0sr0         ; sequence routine for big pentagram
  41. p1m0posrout     dd      p1m0pr3,p1m0pr0 ; big pentagram position routines
  42.  
  43. bigpentopageptr dd      ?,?             ; big pentagram erase locations
  44. bigpentoloc     dw      4 dup(-1)       ; erase locations of big pentagram
  45.  
  46. bwsspwaveloc    db      0,0,0,0         ; locs of waves
  47. bwsspwavedelta  dw      104h,0ff05h,102h,0ff02h
  48. bwsspwavebounds dw      5fch,504h,301h,301h
  49.  
  50. vrtcntr         db      0               ;                                    |
  51. ovrtcntr        db      0               ;                                    |
  52. vrttime         db      ?               ; vertical retraces per frame
  53.  
  54. posfactor       db      128             ; position routine xfer factor
  55.  
  56. bigpentcntr    db    ?        ; loop counter for big pent erase
  57.  
  58. pfieldpageindex db    0        ; pentagram field page index
  59. pfieldpagetbl   db      0,80h           ; page pable for pentagram field
  60. pfieldoff       db      0,0             ; offset of screens for pent field
  61. pfieldframe     db      0,0             ; pentagram field frame index
  62. pfieldframed    db      0               ; pentagram field frame delta
  63. pfieldframetbl  db      0,1,2,3,4,3,2,1
  64.  
  65. bwssppageindex  db      0               ; b/w sinesum plasma page index
  66. bwssppagetbl    db      0,40h           ; b/w sinesum plasma page table
  67. bwsspyoff       db      98              ; Y offset in b/w plasma
  68. bwsspylen       db      2               ; Y size to do in b/w plasma
  69. bwsspxoff       db      0               ; X offset in b/w plasma
  70.  
  71. pr2x            db      2ah
  72. pr2y            db      0
  73. pr2xd           db      0
  74. pr2yd           db      -6
  75.  
  76. pr1x            db      -38h
  77. pr1y            db      0
  78. pr1xd           db      0
  79. pr1yd           db      5
  80.  
  81. pr0x            db      -2ah
  82. pr0y            db      0
  83. pr0xd           db      0
  84. pr0yd           db      6
  85.  
  86. mirrorpal       db      0, 0, 0, 3, 1, 0, 7, 4, 1, 12, 7, 2, 16, 9, 3, 20
  87.                 db      12, 4, 24, 15, 5, 29, 17, 7, 33, 20, 8, 37, 23, 9, 41, 25
  88.                 db      10, 46, 28, 11, 50, 31, 12, 54, 33, 13, 58, 36, 14, 63, 39, 16
  89.                 db      6, 0, 12, 6, 0, 12, 6, 0, 12, 6, 0, 12, 6, 0, 12, 6
  90.                 db      0, 12, 6, 0, 12, 6, 0, 12, 0, 0, 6, 0, 0, 7, 0, 0
  91.                 db      8, 0, 0, 10, 0, 0, 11, 0, 0, 13, 0, 0, 14, 0, 0, 16
  92.                 db      17, 0, 26, 17, 0, 26, 17, 0, 26, 17, 0, 26, 17, 0, 26, 17
  93.                 db      0, 26, 17, 0, 26, 17, 0, 26
  94.  
  95. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  96. ; CODE
  97. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  98.  
  99. ;═════════════════════════════════════════════════════════════════════════════
  100. p1ir4:                                  ; transition, slide to mirror palette
  101.         cld
  102.         push bx ecx esi edi
  103.         mov dx,3c8h
  104.         @outb 0
  105.         mov edi,_cpalptr
  106.         mov esi,edi
  107.         mov ecx,28h*3
  108.         inc edx
  109.         rep outsb
  110.         mov esi,offset mirrorpal
  111.         mov cl,28h*3
  112.         mov bl,1
  113.         call _slidebytes
  114.         jnc short p1ir4d
  115.         mov _vrtrout,offset _ret
  116. p1ir4d:
  117.         pop edi esi ecx bx
  118.         ret
  119.  
  120. ;═════════════════════════════════════════════════════════════════════════════
  121. p1ir2:                                  ; only increment retrace timer
  122.         inc vrtcntr
  123.         ret
  124.  
  125. ;═════════════════════════════════════════════════════════════════════════════
  126. p1ir3:                                  ; set 20h colors of palette at 40h
  127.         cld
  128.         push ecx esi
  129.         mov dx,3c8h
  130.         @outb 40h
  131.         mov esi,_cpalptr
  132.         add esi,40h*3
  133.         inc edx
  134.         mov ecx,20h*3
  135.         rep outsb
  136.         inc vrtcntr
  137.         pop esi ecx
  138.         ret
  139.  
  140. ;═════════════════════════════════════════════════════════════════════════════
  141. p1ir1:                                  ; set 20h colors of palette at 60h
  142.         cld
  143.         push ecx esi
  144.         mov dx,3c8h
  145.         @outb 60h
  146.         mov esi,_cpalptr
  147.         add esi,60h*3
  148.         inc edx
  149.         mov ecx,20h*3
  150.         rep outsb
  151.         inc vrtcntr
  152.         pop esi ecx
  153.         ret
  154.  
  155. ;═════════════════════════════════════════════════════════════════════════════
  156. p1ir0:                                  ; set double width screen
  157.         mov dx,3d4h
  158.         @outw 5013h
  159.         mov _vrtrout,offset _ret
  160.         ret
  161.  
  162. ;═════════════════════════════════════════════════════════════════════════════
  163. _p1:
  164.         mov eax,'p10d'                  ; load and allocate data
  165.         call _loaddata
  166.         mov bigpentsprptr,eax
  167.         add eax,BIGPENTSPRLEN
  168.         mov smallpentsprptr[0],eax
  169.         add eax,SMALLPENTSPRLEN
  170.         mov smallpentsprptr[4],eax
  171.         add eax,SMALLPENTSPRLEN
  172.         mov smallpentsprptr[8],eax
  173.         add eax,SMALLPENTSPRLEN
  174.         mov smallpentsprptr[12],eax
  175.         add eax,SMALLPENTSPRLEN
  176.         mov smallpentsprptr[16],eax
  177.         add eax,SMALLPENTSPRLEN
  178.         mov dpalptr0,eax
  179.         add eax,20h*3
  180.         mov bwsspswtblptr,eax
  181.  
  182.         mov eax,320+64*3
  183.         call _gethimem
  184.         mov bwssprasterbuf,eax
  185.         add eax,320
  186.         mov bwssppalptr,eax
  187.  
  188. waitl0:                                 ; wait for end transition to this part
  189.         cmp _vrtrout,offset _ret
  190.         jne waitl0
  191.  
  192.         mov eax,'muz2'                  ; load up next muzik
  193.         call _loadmuzik
  194.  
  195.         call _gsp669_play               ; start muzik playing
  196.  
  197.         mov esi,_vidptr0                ; transfer page 0 to double width
  198.         mov edi,_vidptr2
  199.         mov bl,200
  200. p1i0l0:
  201.         mov ecx,80
  202.         rep movsb
  203.         add edi,80
  204.         dec bl
  205.         jnz p1i0l0
  206.  
  207.     mov dx,3ceh            ; read plane select index
  208.         @outb 4
  209.     mov dl,0d4h            ; set double width screen mode
  210.         mov ax,800ch
  211.         cli
  212.         out dx,ax
  213.         mov _vrtrout,offset p1ir0
  214.         sti
  215.  
  216. waitl1:                                 ; wait for it to take effect
  217.         cmp _vrtrout,offset _ret
  218.         jne waitl1
  219.  
  220.         mov esi,_vidptr2                ; fill lower page with pentagrams
  221.         lea edi,[esi+80]
  222.         mov bl,200
  223. p1i0l1:
  224.         mov ecx,80
  225.         rep movsb
  226.         add edi,80
  227.         add esi,80
  228.         dec bl
  229.         jnz p1i0l1
  230.  
  231.         mov edi,_vidptr0                ; fill upper page with pentagrams
  232.         mov esi,_vidptr2
  233.         mov ecx,160*200
  234.         rep movsb
  235.  
  236.         mov edi,_cpalptr                ; set single color for big pentagrams
  237.         add edi,60h*3
  238.         mov eax,311f0dh
  239.         mov ecx,20h
  240. p1i0l2:
  241.         stosd
  242.         dec edi
  243.         loop p1i0l2
  244.  
  245.         mov _vrtrout,offset p1ir1       ; set palette setting routine
  246.  
  247. waitl2:                                 ; wait for palette to change
  248.         cmp vrtcntr,0
  249.         je waitl2
  250.  
  251.         mov _vrtrout,offset p1ir2       ; set verical retrace timer
  252.         mov word ptr vrtcntr,1          ; clear vertical retrace count
  253.  
  254. ;═════════════════════════════════════════════════════════════════════════════
  255. ; Interfering pentagrams on field of smaller ones
  256. p1m0:
  257.         movzx ebx,pfieldpageindex       ; erase old big pentagrams
  258.         lea eax,[ebx*4+bigpentoloc]
  259.     cmp word ptr [eax],-1
  260.         je short p1m0f3
  261.         mov ebx,bigpentopageptr[ebx*4]
  262.         mov pagebaseptr,ebx
  263.         call p1m0r2
  264. p1m0f3:
  265.  
  266.         movzx eax,pfieldpageindex       ; get base page loc of pentagram field
  267.         mov ebp,_vidptr0[eax*8]
  268.         movzx ebx,pfieldoff[eax]
  269.         sub bl,10h
  270.         jnc short p1m0f0
  271.         mov bl,50h
  272. p1m0f0:
  273.         mov pfieldoff[eax],bl
  274.         add ebp,ebx
  275.         mov pagebaseptr,ebp
  276.         mov bigpentopageptr[eax*4],ebp
  277.  
  278.         lea edi,[ebp+57*160]            ; copy column of previous pentagrams
  279.         lea esi,[ebp+7*160+10h]
  280.         mov dx,3c5h
  281.         @outb 0fh
  282.         mov dl,0ceh
  283.         @outw 4105h
  284.         call p1m0r0
  285.         cmp bl,30h
  286.         ja short p1m0f1
  287.         sub esi,50*3*160
  288.         sub edi,50*3*160-60h
  289.         call p1m0r0
  290. p1m0f1:
  291.         @outw 4005h
  292.     @outb 4             ; read plane select index
  293.  
  294.         movzx eax,pfieldpageindex       ; put new pentagram frame
  295.         movzx ecx,pfieldframe[eax]
  296.         add cl,pfieldframed
  297.         and cl,7
  298.         mov pfieldframe[eax],cl
  299.         mov cl,pfieldframetbl[ecx]
  300.         mov esi,smallpentsprptr[ecx*4]
  301.         lea edi,[ebp+7*160]
  302.         mov dl,0c5h
  303.         call p1m0r1
  304.         cmp bl,30h
  305.         ja short p1m0f2
  306.         sub esi,64*43
  307.         add edi,60h
  308.         call p1m0r1
  309. p1m0f2:
  310.  
  311.         mov ah,vrtcntr                  ; get vertical retrace length of frame
  312.         mov al,ovrtcntr
  313.         mov ovrtcntr,ah
  314.         sub ah,al
  315.         mov vrttime,ah
  316.  
  317.         mov al,posfactor                ; get position of big pentagrams
  318.         or al,al
  319.         jz short p1m0f4
  320.         sub al,ah
  321.         jbe short p1m0f6
  322.         mov posfactor,al
  323.         movzx ebp,al
  324.         call p1m0posrout[0]
  325.         imul eax,ebp
  326.         sar eax,7
  327.         mov esi,eax
  328.         imul ebx,ebp
  329.         sar ebx,7
  330.         mov edi,ebx
  331.         call p1m0posrout[4]
  332.         dec ebp
  333.         xor bp,7fh
  334.         imul eax,ebp
  335.         sar eax,7
  336.         add eax,esi
  337.         imul ebx,ebp
  338.         sar ebx,7
  339.         add ebx,edi
  340.         jmp short p1m0f5
  341. p1m0f6:
  342.         mov posfactor,0
  343. p1m0f4:
  344.         call p1m0posrout[4]
  345. p1m0f5:
  346.         lea ebx,[ebx*4+ebx]
  347.         shl ebx,7
  348.         add ebx,eax
  349.  
  350.         mov ecx,ebx                     ; put big pentagrams
  351.         neg ecx
  352.         add bx,4138h
  353.         add cx,4138h
  354.         movzx eax,pfieldpageindex
  355.         lea eax,[eax*4+bigpentoloc]
  356.         mov word ptr [eax],bx
  357.         mov word ptr [eax+2],cx
  358.         call p1m0r2
  359.  
  360.     mov dx,3d4h            ; set new page
  361.     movzx ecx,pfieldpageindex
  362.         mov ah,pfieldpagetbl[ecx]
  363.         mov al,0ch
  364.         mov bh,pfieldoff[ecx]
  365.         mov bl,0dh
  366.         cli
  367.         out dx,ax
  368.         mov eax,ebx
  369.         out dx,ax
  370.         mov ah,vrtcntr
  371.         sti
  372.     xor cl,1            ; flip page index
  373.     mov pfieldpageindex,cl
  374.  
  375. waitl3:                                 ; wait for page flip to take effect
  376.         cmp ah,vrtcntr
  377.         je waitl3
  378.  
  379.         jmp p1m0seqrout                 ; jump to appropriate routine
  380.  
  381. ;─────────────────────────────────────────────────────────────────────────────
  382. p1m0sr0:                                ; wait then set bg moving
  383.         cmp _muzloc,MUZLOC0
  384.         jb p1m0
  385.         mov pfieldframed,1
  386.         mov p1m0seqrout,offset p1m0sr1
  387.         jmp p1m0
  388. ;-----------------------------------------------------------------------------
  389. p1m0sr1:                                ; wait then set new movement pattern
  390.         cmp _muzloc,MUZLOC1
  391.         jb p1m0
  392.         mov posfactor,128
  393.         mov p1m0posrout[0],offset p1m0pr0
  394.         mov p1m0posrout[4],offset p1m0pr1
  395.         mov p1m0seqrout,offset p1m0sr2
  396.         jmp p1m0
  397. ;-----------------------------------------------------------------------------
  398. p1m0sr2:                                ; wait then set big pents transparent
  399.         cmp _muzloc,MUZLOC2
  400.         jb p1m0
  401.         mov _vrtrout,offset p1ir1
  402.         mov p1m0seqrout,offset p1m0sr3
  403.         jmp p1m0
  404. ;-----------------------------------------------------------------------------
  405. p1m0sr3:                                ; wait for transparency to be done
  406.         mov edi,_cpalptr
  407.         add edi,60h*3
  408.         mov esi,dpalptr0
  409.         mov ecx,32*3
  410.         mov bl,vrttime
  411.         call _slidebytes
  412.         jnc p1m0
  413.         mov _vrtrout,offset p1ir2
  414.         mov p1m0seqrout,offset p1m0sr4
  415.         jmp p1m0
  416. ;-----------------------------------------------------------------------------
  417. p1m0sr4:                                ; wait then set new movement pattern
  418.         cmp _muzloc,MUZLOC3
  419.         jb p1m0
  420.         mov posfactor,128
  421.         mov p1m0posrout[0],offset p1m0pr1
  422.         mov p1m0posrout[4],offset p1m0pr2
  423.         mov p1m0seqrout,offset p1m0sr5
  424.         jmp p1m0
  425. ;-----------------------------------------------------------------------------
  426. p1m0sr5:                                ; wait then phade out pent field
  427.         cmp _muzloc,MUZLOC4
  428.         jb p1m0
  429.     mov _vrtrout,offset p1ir3
  430.         mov p1m0seqrout,offset p1m0sr6
  431.         jmp p1m0
  432. ;-----------------------------------------------------------------------------
  433. p1m0sr6:                                ; wait for phade to end
  434.     mov edi,_cpalptr
  435.     add edi,40h*3
  436.         mov esi,_clearpalptr
  437.         mov ecx,32*3
  438.         mov bl,vrttime
  439.         call _slidebytes
  440.         jnc p1m0
  441.         mov _vrtrout,offset p1ir2
  442.         mov p1m0seqrout,offset p1m0sr7
  443.         jmp p1m0
  444. ;-----------------------------------------------------------------------------
  445. p1m0sr7:                                ; wait then set movement to final loc
  446.         cmp _muzloc,MUZLOC5
  447.         jb p1m0
  448.         mov posfactor,128
  449.         mov p1m0posrout[0],offset p1m0pr2
  450.         mov p1m0posrout[4],offset p1m0pr3
  451.         mov p1m0seqrout,offset p1m0sr8
  452.         jmp p1m0
  453. ;-----------------------------------------------------------------------------
  454. p1m0sr8:                                ; wait for big pents at final loc
  455.         cmp posfactor,0
  456.         jne p1m0
  457.  
  458. ;═════════════════════════════════════════════════════════════════════════════
  459. p1i1:
  460.         mov vrtcntr,0                   ; reset counter for delay
  461.  
  462.         mov edi,_vidptr2                ; clear page 2
  463.         mov dx,3c5h
  464.         @outb 0fh
  465.         mov ecx,1000h
  466.         xor eax,eax
  467.         rep stosd
  468.  
  469.         mov dl,0d4h                     ; normal screen width
  470.         @outw 2813h
  471.         @outw 000dh                     ; set page 2
  472.         @outw 800ch
  473.  
  474.         mov edi,bwssppalptr             ; set up b/w palette
  475.         mov esi,edi
  476.         mov ecx,20h
  477.         xor edx,edx
  478.         mov ebx,2f2f2f2fh
  479.         xor eax,eax
  480. p1i1l0:
  481.         stosd
  482.         stosd
  483.         stosd
  484.         stosd
  485.         stosd
  486.         stosd
  487.         xchg ebx,eax
  488.         xchg edx,ebx
  489.         loop p1i1l0
  490.         mov ecx,100h
  491.         xor al,al
  492.         mov ah,vrtcntr                  ; change pal on vertical retrace
  493. waitl5:
  494.         cmp ah,vrtcntr
  495.         je waitl5
  496.         call _setcpal
  497.  
  498.         mov edi,_vidptr0                ; clean up all pages
  499.         mov dx,3c5h
  500.         @outb 0fh
  501.         mov ecx,4000h
  502.         xor eax,eax
  503.         rep stosd
  504.  
  505.         mov ebp,80*148                  ; put pentagram outline to pg 0 and 1
  506.         mov esi,80
  507.         mov bx,2020h
  508.         mov edi,_vidptr0
  509.         add edi,82eh
  510.         mov cx,11h
  511.         call bigpentsprptr
  512.         mov edi,_vidptr0
  513.         add edi,87eh
  514.         mov cx,11h
  515.         call bigpentsprptr
  516.         mov edi,_vidptr1
  517.         add edi,82eh
  518.         mov cx,11h
  519.         call bigpentsprptr
  520.         mov edi,_vidptr1
  521.         add edi,87eh
  522.         mov cx,11h
  523.         call bigpentsprptr
  524.  
  525.         mov dl,0d5h                     ; switch to page 1
  526.         @outb 40h
  527.         mov al,vrtcntr                  ; wait for page flip to take effect
  528. waitl7:
  529.         cmp al,vrtcntr
  530.         je waitl7
  531.  
  532.         mov eax,'p11d'                  ; load and put transition bg pic
  533.         call _loaddata
  534.  
  535.         mov edi,_vidptr2                ; put mirror bitmap to pages 2 and 3
  536.         add edi,80*21
  537.         mov esi,eax
  538.         mov ebx,80*168
  539.         call _pbmodex
  540.         mov edi,_vidptr3
  541.         add edi,80*21
  542.         call _pbmodex
  543.  
  544. waitl6:                                 ; delay should be at most 60 retraces
  545.         cmp vrtcntr,80
  546.         jb waitl6
  547.  
  548. ;═════════════════════════════════════════════════════════════════════════════
  549. ; Black and white sinewave sum plasma
  550. p1m1:
  551.         mov edi,3                       ; move waves and change their deltas
  552. p1m1l2:
  553.         mov ax,bwsspwavedelta[edi*2]
  554.         mov bx,bwsspwavebounds[edi*2]
  555.         add bwsspwaveloc[edi],al
  556.         add al,ah
  557.         cmp al,bl
  558.         je short p1m1l2f0
  559.         cmp al,bh
  560.         jne short p1m1l2f1
  561. p1m1l2f0:
  562.         neg ah
  563. p1m1l2f1:
  564.         mov bwsspwavedelta[edi*2],ax
  565.         sub edi,1
  566.         jnc p1m1l2
  567.  
  568.         mov ebp,bwsspswtblptr           ; precalculate X sine wave sums
  569.         mov edi,bwssprasterbuf
  570.         mov esi,edi
  571.         movzx ebx,byte ptr bwsspwaveloc[0]
  572.         movzx ecx,byte ptr bwsspwaveloc[1]
  573.         mov dh,4
  574. p1m1l0:
  575.         mov dl,20
  576. p1m1l0l0:
  577. rept 4
  578.         mov al,[ebp+ebx]
  579.         add al,[ebp+ecx]
  580.         stosb
  581.         add bl,4
  582.         add cl,4
  583. endm
  584.         dec dl
  585.         jnz p1m1l0l0
  586.         sub bl,3fh
  587.         sub cl,3fh
  588.         dec dh
  589.         jnz p1m1l0
  590.  
  591.         movzx eax,bwssppageindex        ; draw b/w thingy to screen
  592.         mov edi,_vidptr0[eax*4]
  593.         movzx eax,bwsspxoff
  594.         add esi,eax
  595.         mov ch,1
  596. p1m1l1:
  597.         mov dx,3c5h
  598.         @outb ch
  599.         movzx edx,bwsspxoff
  600.         mov bh,byte ptr bwsspwaveloc[3]
  601.         mov bl,byte ptr bwsspwaveloc[2]
  602.         mov al,bwsspyoff
  603.         add bh,al
  604.         add bh,al
  605.         add bl,al
  606.         mov cl,bwsspylen
  607.         call p1m1r0
  608.         movzx eax,bwsspyoff
  609.         lea eax,[eax*4+eax]
  610.         lea eax,[eax*4]
  611.         lea edi,[edi+eax*8]
  612.         mov cl,bwsspylen
  613.         call p1m1r0
  614.         sub edi,200*80
  615.         add esi,80
  616.         shl ch,1
  617.         and ch,0fh
  618.         jnz p1m1l1
  619.  
  620.         or dl,dl                        ; put part of bg to opening screen
  621.         jz short p1m1f0
  622.         mov ebp,edx
  623.         mov dx,3c5h
  624.         @outb 0fh
  625.         mov dl,0ceh
  626.         @outw 4105h
  627.         add edi,40
  628.         sub edi,ebp
  629.         mov esi,_vidptr2
  630.         add esi,40
  631.         sub esi,ebp
  632.         call p1m1r1
  633.         lea edi,[edi-200*80+ebp*2-2]
  634.         lea esi,[esi-200*80+ebp*2-2]
  635.         call p1m1r1
  636.         inc edx
  637.         @outb 40h
  638. p1m1f0:
  639.  
  640.         mov dx,3d5h                     ; set new page
  641.         movzx ebx,bwssppageindex
  642.         @outb bwssppagetbl[ebx]
  643.         xor bl,1
  644.         mov bwssppageindex,bl
  645.  
  646.         mov al,vrtcntr                  ; wait for a vertical retrace
  647. waitl4:
  648.         cmp al,vrtcntr
  649.         je waitl4
  650.  
  651.         jmp p1m1seqrout                 ; jump to appropriate routine
  652.  
  653. ;─────────────────────────────────────────────────────────────────────────────
  654. p1m1sr0:                                ; move b/w plasma onto screen
  655.         add bwsspylen,2
  656.         sub bwsspyoff,2
  657.         jnz p1m1
  658.         mov p1m1seqrout,offset p1m1sr1
  659.         jmp p1m1
  660. ;-----------------------------------------------------------------------------
  661. p1m1sr1:                                ; wait for muzik meta point
  662.         cmp _muzloc,MUZLOC6
  663.         jb p1m1
  664.         mov p1m1seqrout,offset p1m1sr2
  665.         jmp p1m1
  666. ;-----------------------------------------------------------------------------
  667. p1m1sr2:                                ; move b/w plasma off screen
  668.         add dword ptr p1m1r0m0[-4],4
  669.         add dword ptr p1m1r0m1[-4],4
  670.         mov al,bwsspxoff
  671.         inc al
  672.         mov bwsspxoff,al
  673.         cmp al,40
  674.         jb p1m1
  675.  
  676. ;-----------------------------------------------------------------------------
  677.         mov dx,3d5h                     ; set page 2
  678.         @outb 80h
  679.  
  680.         mov eax,_ohimembase             ; clean up high memory base ptr
  681.         mov _himembase,eax
  682.         mov _vrtrout,offset p1ir4       ; set transition retrace routine
  683.  
  684.         ret
  685.  
  686. ;─────────────────────────────────────────────────────────────────────────────
  687. p1m0pr0:                                ; position routine 0
  688.         mov edx,1
  689.         movsx ecx,pr0yd
  690.         movsx eax,pr0y
  691.         call p1m0prr0
  692.         mov pr0yd,cl
  693.         mov pr0y,al
  694.         mov ebx,eax
  695.         movsx ecx,pr0xd
  696.         movsx eax,pr0x
  697.         call p1m0prr0
  698.         mov pr0xd,cl
  699.         mov pr0x,al
  700.         ret
  701. ;-----------------------------------------------------------------------------
  702. p1m0pr1:                                ; position routine 1
  703.         mov edx,1
  704.         movsx ecx,pr1yd
  705.         movsx eax,pr1y
  706.         call p1m0prr0
  707.         mov pr1yd,cl
  708.         mov pr1y,al
  709.         mov ebx,eax
  710.         movsx ecx,pr1xd
  711.         movsx eax,pr1x
  712.         call p1m0prr0
  713.         mov pr1xd,cl
  714.         mov pr1x,al
  715.         ret
  716. ;-----------------------------------------------------------------------------
  717. p1m0pr2:                                ; position routine 2
  718.         mov edx,1
  719.         movsx ecx,pr2yd
  720.         movsx eax,pr2y
  721.         call p1m0prr0
  722.         mov pr2yd,cl
  723.         mov pr2y,al
  724.         mov ebx,eax
  725.         mov dl,2
  726.         movsx ecx,pr2xd
  727.         movsx eax,pr2x
  728.         call p1m0prr0
  729.         mov pr2xd,cl
  730.         mov pr2x,al
  731.         ret
  732. ;-----------------------------------------------------------------------------
  733. p1m0pr3:                                ; position routine 3
  734.         xor eax,eax
  735.         xor ebx,ebx
  736.         ret
  737. ;-----------------------------------------------------------------------------
  738. p1m0prr0:                               ; pull a delta in a locs 0 direction
  739.         add eax,ecx
  740.         jz _ret
  741.         or eax,eax
  742.         js short p1m0prr0f0
  743.         sub ecx,edx
  744.         ret
  745. p1m0prr0f0:
  746.         add ecx,edx
  747.         ret
  748.  
  749. ;─────────────────────────────────────────────────────────────────────────────
  750. p1m0r0:                                 ; copy column of 3 small pentagrams
  751.         mov ah,3
  752. p1m0r0l0:
  753.         mov al,43
  754. p1m0r0l0l0:
  755.         mov ecx,10h
  756.         rep movsb
  757.         add edi,90h
  758.         add esi,90h
  759.         dec al
  760.         jnz p1m0r0l0l0
  761.         add edi,7*160
  762.         add esi,7*160
  763.         dec ah
  764.         jnz p1m0r0l0
  765.         ret
  766.  
  767. ;─────────────────────────────────────────────────────────────────────────────
  768. p1m0r1:                                 ; put new small pentagram sprite
  769.         mov al,1
  770. p1m0r1l0:
  771.         out dx,al
  772.         mov ah,43
  773. p1m0r1l0l0:
  774.         mov ecx,10h
  775.         rep movsb
  776.         add edi,90h
  777.         dec ah
  778.         jnz p1m0r1l0l0
  779.         sub edi,43*160
  780.         shl al,1
  781.         and al,0fh
  782.         jnz p1m0r1l0
  783.         ret
  784.  
  785. ;─────────────────────────────────────────────────────────────────────────────
  786. p1m0r2:                 ; put 4 big interfering pentagrams
  787.         mov bigpentcntr,2
  788.         mov ebp,160*148
  789.         mov esi,160
  790.         mov dh,3
  791.         mov bx,2020h
  792. p1m0r2l0:
  793.         mov bigpentlocptr,eax
  794.         movzx edi,word ptr [eax]
  795.         mov eax,edi
  796.         and eax,3
  797.         mov cl,_vidbitloc2[eax]
  798.         mov ch,al
  799.         shr edi,2
  800.         add edi,pagebaseptr
  801.         call bigpentsprptr
  802.         mov eax,bigpentlocptr
  803.         add eax,2
  804.         dec bigpentcntr
  805.         jnz p1m0r2l0
  806.         ret
  807.  
  808. ;─────────────────────────────────────────────────────────────────────────────
  809. p1m1r0:                                 ; put a part of b/w plasma
  810.         movzx eax,bh
  811.         movzx ebx,bl
  812.         mov ah,[ebp+eax]
  813.         add ah,[ebp+ebx]
  814.         mov bh,al
  815.         inc bl
  816.         add bh,2
  817.         db 0e9h,0,0,0,0         ; jmp near ptr $+5
  818. p1m1r0m0:
  819. rept 40
  820.         lodsb
  821.         add al,ah
  822.         stosb
  823. endm
  824.         lea edi,[edi+edx*2]
  825.         db 0e9h,0,0,0,0         ; jmp near ptr $+5
  826. p1m1r0m1:
  827. rept 40
  828.         lodsb
  829.         add al,ah
  830.         stosb
  831. endm
  832.         lea esi,[esi+edx*2-80]
  833.         dec cl
  834.         jnz p1m1r0
  835.         ret
  836.  
  837. ;─────────────────────────────────────────────────────────────────────────────
  838. p1m1r1:                                 ; copy part of bg to opening screen
  839.         mov ecx,25
  840. p1m1r1l0:
  841. irp temp,<0,1,2,3,4,5,6,7>
  842.         mov al,[esi+&temp*80]
  843.         mov [edi+&temp*80],al
  844.         mov al,[esi+&temp*80+1]
  845.         mov [edi+&temp*80+1],al
  846. endm
  847.         add edi,8*80
  848.         add esi,8*80
  849.         dec ecx
  850.         jnz p1m1r1l0
  851.         ret
  852.  
  853. code32    ends
  854.         end
  855.  
  856.